Encode and Decode Strings

Design an algorithm to encode a list of strings to a string. The encoded string is then sent over the network and is decoded back to the original list of strings.

Machine 1 (sender) has the function:

  1. string encode(vector<string> strs) {
  2. // ... your code
  3. return encoded_string;
  4. }

Machine 2 (receiver) has the function:

  1. vector<string> decode(string s) {
  2. //... your code
  3. return strs;
  4. }

So Machine 1 does:

  1. string encoded_string = encode(strs);

and Machine 2 does:

  1. vector<string> strs2 = decode(encoded_string);

strs2 in Machine 2 should be the same as strs in Machine 1.

Implement the encode and decode methods.

Note:

  • The string may contain any possible characters out of 256 valid ascii characters. Your algorithm should be generalized enough to work on any possible characters.
  • Do not use class member/global/static variables to store states. Your encode and decode algorithms should be stateless.
  • Do not rely on any library method such as eval or serialize methods. You should implement your own encode/decode algorithm.

Solution:

  1. public class Codec {
  2. // Encodes a list of strings to a single string.
  3. public String encode(List<String> strs) {
  4. StringBuilder sb = new StringBuilder();
  5. for(String s : strs) {
  6. sb.append(s.length()).append('/').append(s);
  7. }
  8. return sb.toString();
  9. }
  10. // Decodes a single string to a list of strings.
  11. public List<String> decode(String s) {
  12. List<String> ret = new ArrayList<String>();
  13. int i = 0;
  14. while(i < s.length()) {
  15. int slash = s.indexOf('/', i);
  16. int size = Integer.valueOf(s.substring(i, slash));
  17. ret.add(s.substring(slash + 1, slash + size + 1));
  18. i = slash + size + 1;
  19. }
  20. return ret;
  21. }
  22. }
  23. // Your Codec object will be instantiated and called as such:
  24. // Codec codec = new Codec();
  25. // codec.decode(codec.encode(strs));